home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 24 / Amiga Format AFCD24 (Feb 1998, Issue 108).iso / -in_the_mag- / emulation / -otherstuff- / amiganpi / src_c / fram.c < prev    next >
C/C++ Source or Header  |  1998-01-05  |  1KB  |  79 lines

  1. #include <stdio.h>
  2.  
  3. #define SYN 0x16
  4. #define DLE 0x10
  5. #define STX 0x02
  6. #define ETX 0x03
  7.  
  8. FILE* newton;
  9.  
  10. inline void fcscalc(unsigned short *fcs, unsigned char data) {
  11.     *fcs = updcrc(*fcs, &data, 1);
  12. }
  13.  
  14. int
  15. read_frame(char *buff) {
  16.     char buf=SYN;
  17.     int i=0;
  18.     char *org=buff;
  19.     unsigned short fcs=0;
  20.     unsigned short fcs_rec=0;
  21.  
  22.     for(;buf==SYN;buf=getc(newton));
  23.     if(buf==DLE && getc(newton)==STX) {
  24.         for(;;) {
  25.             buf=getc(newton);
  26.             if(buf==DLE) {
  27.                 buf=getc(newton);
  28.                 if(buf==ETX) {
  29.                     fcscalc(&fcs,buf);
  30.                     fcs_rec=getc(newton);
  31.                     fcs_rec|=getc(newton)<<8;
  32.                     if(fcs_rec==fcs) {
  33.                         return(i);
  34.                     } else {
  35.                         fprintf(stderr,"Bad CRC\n");
  36.                         fflush(stderr);
  37.                         return -1;
  38.                     }
  39.                 } else if(buf==DLE) {
  40.                     *buff++=buf;
  41.                     fcscalc(&fcs,buf);
  42.                     i++;
  43.                 } else {
  44.                     fprintf(stderr,"Invalid frame\n");
  45.                     fflush(stderr);
  46.                     return -1;
  47.                 }
  48.             } else {
  49.                 *buff++=buf;
  50.                 fcscalc(&fcs,buf);
  51.                 i++;
  52.             }
  53.         }
  54.     }
  55. }
  56.  
  57. send_frame(char *buff, int size) {
  58.     int i;
  59.     unsigned short fcs = 0;
  60.  
  61.     putc(SYN,newton);
  62.     putc(DLE,newton);
  63.     putc(STX,newton);
  64.  
  65.     for(i=0;i<size;i++) {
  66.         putc(buff[i],newton);
  67.         if(buff[i]==DLE)
  68.             putc(DLE,newton);
  69.         fcscalc(&fcs, buff[i]);
  70.     }
  71.  
  72.     putc(DLE,newton);
  73.     putc(ETX,newton);
  74.     fcscalc(&fcs, ETX);
  75.     putc(fcs&0x00ff,newton);
  76.     putc((fcs&0xff00)>>8,newton);
  77.     fflush(newton);
  78. }
  79.